Vanillin production

In 2010, Brochado et al used heuristic optimization together with flux simulations to design a vanillin producing yeast strain.

Brochado, A. R., Andrejev, S., Maranas, C. D., & Patil, K. R. (2012). Impact of stoichiometry representation on simulation of genotype-phenotype relationships in metabolic networks. PLoS Computational Biology, 8(11), e1002758. doi:10.1371/journal.pcbi.1002758

Genome-scale metabolic model

In their work, the authors used iFF708 model, but recent insights in Yeast yielded newer and more complete versions. The latest version of S. cerevisiae model is Yeast 7.6. This model constains a higher coverage of gene functions.

Becuase this algorithms should be agnostic to the model, we implement the same strategy with the latest model.

from cameo import models
model = models.minho.yeast_7_6
import warnings
with warnings.catch_warnings():
    warnings.simplefilter('ignore')
    #Fix gene rules compatibility
    for reaction in model.reactions:
        while "AND" in reaction.gene_reaction_rule or "OR" in reaction.gene_reaction_rule:
            reaction.gene_reaction_rule = reaction._gene_reaction_rule.replace("AND", "and").replace("OR", "or")

Constraints can be set in the model according to data found in the literature. The defined conditions allow the simulation of phenotypes very close to the experimental results.

**Model validation by comparing in silico prediction of the specific

growth rate with experimental data**. Growth phenotypes were collected from literature and compared to simulated values for chemostat cultivations at four different conditions, nitrogen limited aerobic (green) and anaerobic (red), carbon limited aerobic (blue) and anaerobic (white).

Österlund, T., Nookaew, I., Bordel, S., & Nielsen, J. (2013). Mapping condition-dependent regulation of metabolism in yeast through genome-scale modeling. BMC Systems Biology, 7, 36. doi:10.1186/1752-0509-7-36

model.reactions.r_1714.lower_bound = -13 #glucose exchange
model.reactions.r_1992.lower_bound = -3  #oxygen exchange
model.medium
reaction_id reaction_name lower_bound upper_bound
0 r_1654 ammonium exchange -1000 1000
1 r_1714 D-glucose exchange -13 1000
2 r_1832 H+ exchange -1000 1000
3 r_1861 iron(2+) exchange -1000 1000
4 r_1992 oxygen exchange -3 1000
5 r_2005 phosphate exchange -1000 1000
6 r_2020 potassium exchange -1000 1000
7 r_2049 sodium exchange -1000 1000
8 r_2060 sulphate exchange -1000 1000
9 r_2100 water exchange -1000 1000
model.objective = model.reactions.r_2111 #growth
model.optimize().f
0.3925993816536346

Heterologous pathway

Vanillin is not produced by S. cervisiae. In their work an heterolgous pathway is inserted to allow generate a vanillin production strain. The pathway is described as:

**Schematic representation of the de novo VG biosynthetic pathway in S.

Cerevisisae** (as designed by Hansen et al [5]). Metabolites are shown in black, enzymes are shown in black and in italic, cofactors and additional precursors are shown in red. Reactions catalyzed by heterologously introduced enzymes are shown in red. Reactions converting glucose to aromatic amino acids are represented by dashed black arrows. Metabolite secretion is represented by solid black arrows where relative thickness corresponds to relative extracellular accumulation. 3-DSH stands for 3-dedhydroshikimate, PAC stands for protocathechuic acid, PAL stands for protocatechuic aldehyde, SAM stands for S-adenosylmethionine. 3DSD stands for 3-dedhydroshikimate dehydratase, ACAR stands for aryl carboxylic acid reductase, PPTase stands for phosphopantetheine transferase, hsOMT stands for O-methyltransferase, and UGT stands for UDP-glycosyltransferase. Adapted from Hansen et al. [5]. Brochado et al. Microbial Cell Factories 2010 9:84 doi:10.1186/1475-2859-9-84

Using cameo, is very easy to generate a pathway and add it to a model.

from cameo.core.pathway import Pathway
vanillin_pathway = Pathway.from_file("data/vanillin_pathway.tsv")
vanillin_pathway.data_frame
equation lower_bound upper_bound
3DSD 3-dehydroshikimate --> protocathechuic acid + H2O 0 1000
ACAR_PPTase ATP + protocathechuic acid + NADPH --> ADP + N... 0 1000
hsOMT protocatechuic aldehyde + S-adenosyl-L-methion... 0 1000
UGT UDP-glucose + Vanillin --> vanillin-B-glucoside 0 1000

And now we can plug the pathway to the model.

vanillin_pathway.plug_model(model)
from cameo import phenotypic_phase_plane
production_envelope = phenotypic_phase_plane(model, variables=[model.reactions.r_2111],
                                             objective=model.reactions.EX_vnlBglu)
production_envelope.plot()

To find gene knockout targets, we use cameo.strain_design.heuristic package which implements the OptGene strategy.

The authors used the biomass-product coupled yield (bpcy) for optimization which is the equivalent of running OptGene in non-robust mode. All simulations were computed using MOMA but because cameo does not implement MOMA we use it’s equivalent linear version (it minimizes the absolute distance instead of the quadratic distance). The linear MOMA version is faster than the original MOMA formulation.

from cameo.strain_design.heuristic.evolutionary_based import OptGene
from cameo.flux_analysis.simulation import lmoma
optgene = OptGene(model)
%prun optgene.run(target="EX_vnlBglu", biomass="r_2111", substrate="r_1714", simulation_method=lmoma, robust=False)
INFO:cameo.strain_design.heuristic.evolutionary.optimization:No WT reference found, generating using pfba.
Starting optimization at Thu, 14 Jan 2016 15:30:20
Using saved session configuration for http://localhost:5006/
To override, pass 'load_from_config=False' to Session
/Users/joao/.virtualenvs/cameo-py3/lib/python3.4/site-packages/bokeh/session.py:318 UserWarning: You need to start the bokeh-server to see this example.
 0%
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>